package zl.tools;

import java.io.File;
import java.io.FileInputStream;
import java.io.PrintStream;


/**
 * @author  SuperZL
 * @version 2012-8-28 下午9:24:13
 * 写此类的最初目的是为了格式化JQuery源代码方便查看
 */
public class FormatUtil{
	
	private static File file;		//存储提供修改的文件
	private static int start;		//开始符号“{”的个数
	private static int end;			//结束符号“}”的个数
	private static FileInputStream in;	//文件输入流
	private static PrintStream out;		//文件输出流

	/**
	 * 初始化方法、为指定参数初始化、如有异常则抛出
	 */
	private static void init()throws Exception{
		if(null == file || !file.exists() || !file.isFile())
			throw new Exception("文件路径不存在、或所给路径非文件类型");
		String name = file.getName();					//文件名
		int index = file.getName().lastIndexOf(".");	
		//输出文件的完整路径名
		String newName = file.getParent()+File.separator+name.substring(0,index+1)+"format"+name.substring(index);
		//根据文件得到输入输出流
		out = new PrintStream(newName);
		in = new FileInputStream(file);
	}

	/**
	 * 格式化方法
	 *@param fileName 需要格式化文件的文件名、如有异常则抛出
	 */
	public static void format(String fileName) throws Exception{
		file = new File(fileName);	//实例化文件对象
		init();		//初始化
		StringBuffer sb = new StringBuffer();
		int i;
		while(-1 != (i = in.read())){
			String str = String.valueOf((char)i);
			sb.append(str);
			//按照指定方式格式化文件内容
			if(str.equals("{")){
				start++;
				sb.append("\n"+addTab(start-end));
			}else if(str.equals("}")){
				end++;
				sb.insert(sb.length()-1,"\n"+addTab(start-end));
				sb.append("\n"+addTab(start-end));
			}else if(str.equals(";")){
				sb.append("\n"+addTab(start-end));
			}
		}
		//将处理后的文件内容写入新文件
		out.print(sb);
		out.close();
	}

	/**
	 * 用来获得tab转义符
	 *@param count 所需转义符个数
	 */
	private static String addTab(int count){
		String str="";
		for(int i = 0; i < count; i++){
			str+="\t";
		}
		return str;
	}

	public static void main(String[] args) throws Exception{
		if(null == args || args.length == 0)
		{
			System.out.println("请添加参数(需要格式化文件的完整路径)");
			System.exit(1);
		}
		FormatUtil.format(args[0]);
		System.out.println("格式化完成、\n格式化后的文件以'***.format.***'命名形式在原文件路径下");
	}
}